import { unique } from '@/utils/string.js'
import storage from '@/utils/storage'
import OSS from 'ali-oss'
const path=require("path")

// 阿里云OSS客户端初始化
let client = null

// 初始化OSS客户端
function initOSSClient() {
	if (!client) {
		client = new OSS({
			region: 'me-south-1', // 根据实际地域填写
			accessKeyId: 'LTAI5tJGQVDttcJgENYoYRxC',
			accessKeySecret: '7Sn4KHslKstrYc5O6YlN2xxKzyb5wP',
			bucket: 'adk-tong', // 替换为您的bucket名称
		})
	}
	return client
}

function readFileAsArrayBuffer(filePath) {
	return new Promise((resolve, reject) => {
		// #ifdef MP-WEIXIN
		if (!filePath || typeof filePath !== 'string') {
			reject(new Error('文件路径无效: ' + filePath))
			return
		}

		// 使用文件系统管理器读取文件（兼容更低版本基础库）
		const fs = wx.getFileSystemManager() // 获取文件系统管理器
		fs.readFile({
			filePath: filePath,
			encoding: 'arraybuffer', // 指定编码为arraybuffer
			success: (res) => {
				console.log('文件读取成功:', res)
				if (res.data instanceof ArrayBuffer) {
					resolve(res.data)
				} else {
					try {
						const uint8Array = new Uint8Array(res.data)
						resolve(uint8Array.buffer)
					} catch (e) {
						reject(new Error('数据转换失败: ' + e.message))
					}
				}
			},
			fail: (err) => {
				console.error('读取文件失败:', err)
				reject(new Error('读取文件失败: ' + JSON.stringify(err)))
			}
		})
		// #endif

		// #ifdef H5
		resolve(filePath)
		// #endif

		// #ifdef APP-PLUS
		// App环境补充（如果需要）
		// #endif
	})
}

/**
 * 上传文件到阿里云OSS
 * @param {Object} fileData - 文件数据对象
 * @param {String} fileData.path - 文件路径(H5)或临时路径(小程序)
 * @param {File} fileData.file - 文件对象(H5)
 * @param {Object} opts - 选项参数
 * @param {Function} opts.onProgress - 进度回调
 */
export async function uploadFileToAliOSS(fileData, opts = {}) {
	console.log('fileData===================', fileData)
	let currentUser = storage.get('STORAGE_CURRENT_USER')
	console.log('上传文件数据:', fileData)
	if (!currentUser) {
		throw new Error('未获取到当前用户信息')
	}

	// 初始化OSS客户端
	const ossClient = initOSSClient()

	opts = Object.assign({
		onProgress: null
	}, opts)

	return new Promise(async (resolve, reject) => {
		try {
			// 正确获取文件名
			const fileName = fileData.file?.name ||
				fileData.tempFilePath?.split('/').pop() ||
				fileData.path?.split('/').pop() || ''
			const extension = getFileExtension(fileName)
			const objectKey = `/ztc/weapp/${currentUser.userId}/${unique()}.${extension}`

			// 准备上传参数
			let uploadValue

			// #ifdef H5
			uploadValue = fileData.file // H5环境下使用File对象
			console.log('H5环境上传值类型:', typeof uploadValue, uploadValue)
			// #endif

			// #ifdef MP-WEIXIN
			// 微信小程序环境下需要先读取文件为ArrayBuffer
			// 优先使用 tempFilePath，其次是 path
			const filePath = fileData.tempFilePath || fileData.path
			if (!filePath) {
				throw new Error('未找到文件路径')
			}
			uploadValue = await readFileAsArrayBuffer(filePath)
			console.log('小程序环境上传值类型:', Object.prototype.toString.call(uploadValue), uploadValue)
			// #endif

			// 构造上传参数
			const options = {
				headers: {
					'x-oss-storage-class': 'Standard',
					'x-oss-object-acl': 'private'
				}
			}

			// 如果有进度回调，添加进度监听
			if (opts.onProgress) {
				options.progress = (progress) => {
					opts.onProgress({
						percent: progress.percent * 100
					})
				}
			}

			// 执行上传
			const result = await ossClient.put(objectKey, uploadValue, options)

			resolve({
				path: result.url
			})
		} catch (error) {
			console.error('阿里云OSS上传失败:', error)
			reject(error)
		}
	})
}



/**
 * 获取文件扩展名
 * @param {string} fileName - 文件名
 * @returns {string} 文件扩展名
 */
export function getFileExtension(fileName) {
	const lastDotIndex = fileName.lastIndexOf('.')
	if (lastDotIndex === -1) {
		return '' // 如果没有找到点号，返回空字符串
	}
	return fileName.slice(lastDotIndex + 1).toLowerCase()
}
